package Day_0131.JVM;

/**
 * @author zxc
 * @date 2023/01/31 16:44
 **/
public class HashMap_ConcurrentHashMap {
    public static void main(String[] args) {
        /**
         * HashMap和ConcurrentHashMap的异同点
         * 1. 都是 key-value 形式的存储数据;
         *
         * 2. HashMap 是线程不安全的，ConcurrentHashMap 是 JUC 下的线程安全的；
         *
         * 3. 底层数据结构
         * （1）HashMap 底层数据结构是数组 + 链表（JDK 1.8 之前）。
         *  JDK 1.8 之后是数组 + 链表 + 红黑树。
         *  当链表中元素个数达到 8 的时候，链表的查询速度不如红黑树快，链表会转为红黑树，红黑树查询速度快；
         *  HashMap 初始数组大小为 16（默认），当出现扩容的时候，以 0.75 * 数组大小的方式进行扩容；
         * （2）ConcurrentHashMap
         *  在 JDK 1.8 之前是采用分段锁来现实的 Segment + HashEntry，Segment 数组大小默认是 16，2 的 n 次方；
         *  JDK 1.8 之后，采用 Node + CAS + Synchronized来保证并发安全进行实现。
         */

        /**
         * 红黑树特点 ：
         * （1）每个节点为红色/黑色;
         * （2）根节点为黑色;
         * （3）每个叶子节点都是黑色的;
         * （4）如果一个叶子节点为红色的话，那么该叶子节点的所有子节点都为黑色;
         * （5）从一个节点到该节点的子孙节点的所有路径上，都包含了相同数量的黑色节点;
         */
    }
}
